const { app, BrowserWindow, ipcMain, dialog, shell , protocol} = require('electron')
const path = require('path')
const fs = require('fs')
// 导入整个模块作为 printService 对象
const printService = require('./services/print-service')
const url = require('url')

let mainWindow

// 注册自定义协议
function createProtocol(scheme) {
  protocol.registerFileProtocol(scheme, (request, callback) => {
    try {
      const urlObj = new URL(request.url);
      console.log('请求URL:', request.url);
      console.log('URL路径名:', urlObj.pathname);
      
      // 移除开头的斜杠
      const pathname = urlObj.pathname.startsWith('/') ? urlObj.pathname.slice(1) : urlObj.pathname;
      
      let filePath = path.normalize(`${__dirname}/../app/${pathname}`);
      console.log('完整文件路径:', filePath);
      
      // 检查文件是否存在
      if (fs.existsSync(filePath)) {
        console.log('文件存在，返回路径');
        callback({ path: filePath });
      } else {
        console.error('文件不存在:', filePath);
        callback({ error: -6 }); // 文件不存在错误
      }
    } catch (error) {
      console.error('协议处理错误:', error);
      callback({ error: -2 });
    }
  });
}

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 900,
    height: 600,
    frame: false, // 无边框窗口
    webPreferences: {
      // 修改预加载脚本的路径，注意 __dirname 在这里是 src 目录
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false
    }
  })

  // 在开发环境中，应该使用 process.env.WEBPACK_DEV_SERVER_URL 加载页面
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    // 打开开发者工具以便调试
    // mainWindow.webContents.openDevTools()
  } else {
    // 创建自定义协议
    createProtocol('app')
    
    // 使用自定义协议加载页面
    mainWindow.loadURL('app://./index.html')
    // mainWindow.webContents.openDevTools()
    
    // 添加错误处理
    let loadAttempts = 0;
    mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription) => {
      console.error('页面加载失败:', errorCode, errorDescription);
      
      // 限制重试次数，避免死循环
      if (loadAttempts < 2) {
        loadAttempts++;
        console.log(`尝试重新加载 (${loadAttempts}/2)...`);
        
        // 使用不同的方法尝试加载
        if (loadAttempts === 1) {
          // 第一次重试：使用 loadFile 方法
          try {
            const indexPath = path.join(__dirname, '../dist_electron/bundled/index.html');
            console.log('尝试加载:', indexPath);
            mainWindow.loadFile(indexPath);
          } catch (err) {
            console.error('备用加载方法失败:', err);
          }
        } else {
          // 第二次重试：使用绝对路径
          try {
            const absolutePath = path.resolve(__dirname, '../dist_electron/bundled/index.html');
            console.log('尝试使用绝对路径加载:', absolutePath);
            mainWindow.loadFile(absolutePath);
          } catch (err) {
            console.error('绝对路径加载失败:', err);
          }
        }
      } else {
        console.error('多次尝试加载页面失败，放弃重试');
        // 显示错误信息
        mainWindow.webContents.executeJavaScript(`
          document.body.innerHTML = '<div style="text-align:center; padding:50px;"><h2>加载页面失败</h2><p>错误代码: ${errorCode}</p><p>错误描述: ${errorDescription}</p><button onclick="window.location.reload()">重试</button></div>';
        `).catch(err => console.error('无法显示错误页面:', err));
      }
    });
  }
  // 添加页面加载完成事件
  mainWindow.webContents.on('did-finish-load', () => {
    console.log('页面加载完成')
  })
}

app.whenReady().then(() => {
  createWindow()
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

// 窗口控制
ipcMain.handle('window:minimize', () => {
  mainWindow.minimize()
  return true
})

ipcMain.handle('window:maximize', () => {
  if (mainWindow.isMaximized()) {
    mainWindow.unmaximize()
    return false
  } else {
    mainWindow.maximize()
    return true
  }
})

ipcMain.handle('window:close', () => {
  mainWindow.close()
})

ipcMain.handle('window:drag', () => {
  // 在 Windows 上，无边框窗口的拖动需要在渲染进程中处理
  // 这里只是一个占位函数
})

// 文件操作
ipcMain.handle('dialog:openFile', async () => {
  const { canceled, filePaths } = await dialog.showOpenDialog({
    properties: ['openFile', 'multiSelections'],
    filters: [
      { name: '所有文件', extensions: ['*'] },
      { name: '文档', extensions: ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'] }
    ]
  })
  return canceled ? [] : filePaths
})

ipcMain.handle('file:showInFolder', async (event, filePath) => {
  try {
    await shell.showItemInFolder(filePath)
    return { success: true }
  } catch (error) {
    return { success: false, error: error.message }
  }
})

// 打印功能
// 添加打印相关的IPC处理
ipcMain.handle('printer:getPrinters', async () => {
  console.log('收到获取打印机列表请求');
  try {
    const printers = await printService.getPrinters();
    console.log('获取到打印机列表:', printers);
    return printers;
  } catch (error) {
    console.error('获取打印机列表失败:', error);
    throw error;
  }
});

ipcMain.handle('printer:printFile', async (event, options) => {
  try {
    const result = await printService.print(options);
    return { success: true, ...result };
  } catch (error) {
    console.error('打印失败:', error);
    return { success: false, error: error.message };
  }
});

ipcMain.handle('printer:batchPrint', async (event, options) => {
  try {
    const result = await printService.batchPrint(options);
    return { success: true, ...result };
  } catch (error) {
    console.error('批量打印失败:', error);
    return { success: false, error: error.message };
  }
});

ipcMain.handle('printer:testPrinter', async (event, printerName) => {
  try {
    const result = await printService.testPrinter(printerName);
    return { success: true, ...result };
  } catch (error) {
    console.error('测试打印机失败:', error);
    return { success: false, error: error.message };
  }
});

ipcMain.handle('printer:getSystemInfo', async () => {
  try {
    const result = await printService.getSystemInfo();
    return { success: true, ...result };
  } catch (error) {
    console.error('获取系统信息失败:', error);
    return { success: false, error: error.message };
  }
});